package com.group2.comprehensive_treatment.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * ComprehensiveTreatment
 * com.group2.comprehensive_treatment.utils
 * 类功能描述
 *
 * @author: August
 * @date: 2025/3/12 19:32
 */

public class JwtUtils {
    /**
     * 过期时间，单位：秒，默认半⼩时过期
     **/
    private static final long EXPIRATION = 60 * 30L * 1000;
    /**
     * 密钥，⼀般⻓度较⻓，内容较复杂
     **/
    private static final String SECRET = "chenxin";

    /**
     * @description 创建
     * token
     * @date 20:49 2022/3/31
     **/
    public static String createToken(Map<String, String> claimMap) {
        //当前时间戳加上设定的毫秒数（1秒== 1000毫秒）

        System.out.println(EXPIRATION);
        System.out.println(new Date().getTime() + EXPIRATION);
        Date expiration = new Date(new Date().getTime() + EXPIRATION);
        //设置JWT头部

        Map<String, Object> map = new HashMap<>();
        map.put("alg", "HS256");
        map.put("typ", "JWT");
        //创建token
        JWTCreator.Builder builder = JWT.create();
        System.out.println(" 创建 Token 的参数 claimMap:" + claimMap);
        //使⽤Lambda创建payload
        claimMap.forEach((k, v) -> {
            builder.withClaim(k, v);
        });
        System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:ss ").format(expiration));
        //添加头部，可省略保持默认，默认即map中的键值对

        return builder.withHeader(map)
        //设置过期时间
                .withExpiresAt(expiration)
        //设置签名解码算法
                .sign(Algorithm.HMAC256(SECRET));
    }

    /**
     * @description 验证
     * token
     * @author xBaozi
     * @date 23:36 2022/3/31
     **/
    public static DecodedJWT verifyToken(String token) {
        DecodedJWT verify = JWT.require(Algorithm.HMAC256(SECRET)).build().verify(token);
        System.out.println(" 验证 Token 的函数得到的 Token："+verify.getToken());
        System.out.println(" 验证 Token 的函数得到的 Header："+verify.getHeader());
        return verify;
    }
}
